package com.jq.jqaicode.common.file;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.jq.jqaicode.common.AppConstant;
import com.jq.jqaicode.common.ResultUtils;
import com.jq.jqaicode.model.dto.HtmlCodeResult;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * 解析和保存文件 模版类
 */
public abstract class CodeParserSaveTemplate {

    /**
     * 文件保存的根目录
     */
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;


    public final void codeParserSave(String appId,String message,String type){
        // 1.解析代码--子类实现
        HtmlCodeResult htmlCodeResult=parseCode(message);
        // 2. 验证输入
        validateInput(htmlCodeResult);
        // 3.获取目录路径
        String buildUniqueDir = buildUniqueDir(appId, type);
        // 4. 保存文件（具体实现交给子类）
        saveFiles(htmlCodeResult, buildUniqueDir);
    }

    // 4. 保存文件（具体实现交给子类）
    protected abstract void saveFiles(HtmlCodeResult htmlCodeResult, String buildUniqueDir);

    protected void validateInput(HtmlCodeResult htmlCodeResult){
        if(htmlCodeResult==null || StrUtil.isBlank(htmlCodeResult.getHtmlCode())){
            ResultUtils.runError("解析代码结果报错");
        }
    }

    //解析代码--子类实现
    protected abstract HtmlCodeResult parseCode(String message);


    /**
     * 构建文件的唯一路径：tmp/code_output/type_雪花 ID
     *
     * @param appId 应用 ID
     * @return 目录路径
     */
    public static String buildUniqueDir(String appId,String type) {
        if (appId == null) {
            ResultUtils.runError("应用 ID 不能为空");
        }
        String uniqueDirName = StrUtil.format("{}_{}", type,appId);//项目名
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        //FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 写入单个文件的工具方法
     *
     * @param buildUniqueDir  目录路径
     * @param filename 文件名
     * @param content  文件内容
     */
    protected static void writeToFile(String buildUniqueDir, String filename, String content) {
        String filePath =buildUniqueDir+ File.separator + filename.replace("/",File.separator);
        FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
    }
}
